home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESBIND / AESFSEL2.S < prev    next >
Text File  |  1989-07-22  |  21KB  |  462 lines

  1.  
  2. ;*========================================================================
  3. ;*
  4. ;* AESFAST Public Domain GEM bindings.
  5. ;*  Maintenance:
  6. ;*   02/11/89 v1.1: This source file is new with this version.
  7. ;*
  8. ;*   04/07/89 v1.2: 
  9. ;*            The calculation of the location of the prompt on the
  10. ;*            screen has been changed.  It was placed one boxchar height
  11. ;*            down on the screen, putting it right below the menu bar.
  12. ;*            This didn't look too good on a big-monitor system, so now
  13. ;*            it is calculated by centering the box, then subtracting a
  14. ;*            fixed offset from the centered Y to make it appear right
  15. ;*            above the fsel'er box.  The offset is 9 character heights,
  16. ;*            (plus 2 extra char heights for the prompt itself), less
  17. ;*            2 pixels (just to line everything up real neat).
  18. ;*
  19. ;*   07/22/89 v1.3:
  20. ;*            Bugfix...A 'bra.s' instruction was missing just before the
  21. ;*            'strcpy' routine, causing 4 bombs on a pre-1.4 machine.
  22. ;*========================================================================
  23.  
  24.           .include  "aesfast.sh"
  25.           .include  "gemfast.sh"
  26.           .extern   _gl_apversion
  27.           .extern   aesblock
  28.  
  29. ;*************************************************************************
  30. ;*
  31. ;* Extended fsel manager routine.
  32. ;*  (Including simulation routines for pre-TOS 1.4 systems).
  33. ;*
  34. ;*************************************************************************
  35.  
  36. ;-------------------------------------------------------------------------
  37. ; fsel_exinput
  38. ;  This function is new with TOS 1.4, but this binding supports it in all
  39. ;  TOS/AES versions with a simulation of the new routine's actions if the
  40. ;  AES version we're running under is pre-TOS 1.4
  41. ;-------------------------------------------------------------------------
  42.  
  43. _fsel_exinput::
  44.  
  45.           .cargs    #8,.pinpath.l,.pinsel.l,.pbutton.l,.plabel.l
  46.           link      a6,#-4
  47.  
  48.           move.w    _gl_apversion,d0         ; Check the AES version.  If
  49.           cmp.w     #$0104,d0                ; it's $0104, we're running
  50.           beq.s     .ramaes                  ; on the RAM-based TOS 1.4
  51.           cmp.w     #$0130,d0                ; Else, if it's less than $0130
  52.           blt       simu_exinput             ; we have to simulate exinput.
  53. .ramaes:
  54.           move.l    .plabel(a6),d0           ; Swap the button and prompt
  55.           move.l    .pbutton(a6),.plabel(a6) ; string pointers to make the
  56.           move.l    d0,.pbutton(a6)          ; addrin stuff contiguous.
  57.  
  58.           AControl  91,0,2,3                 ; AES v1.3 & up: fsel_exinput
  59.           moveq.l   #-4,d2                   ; is a legal function, do it.
  60.           lea       .pinpath(a6),a0          ; a0 -> addrin
  61.           ACall     RET2HERE                 ; Call AES.
  62.  
  63.           move.l    .plabel(a6),d0           ; Swap the prompt string and
  64.           move.l    .pbutton(a6),.plabel(a6) ; button pointers back to how
  65.           move.l    d0,.pbutton(a6)          ; they were on entry.
  66.  
  67.           moveq.l   #-4,d1                   ; Return values from
  68.           lea       .pbutton(a6),a1          ; intout[] array to caller
  69.           jmp       (a0)                     ; via aes_return routine.
  70.  
  71. ;*************************************************************************
  72. ; The following code and data supports the exinput simulation routines.
  73. ;
  74. ; The simulator supports *most* of the TOS 1.4 features, to wit:
  75. ;
  76. ;  - A prompt string of up to 30 chars is displayed with the file selector.
  77. ;  - The file selector handles <CR> like TOS 1.4 does (see comments below).
  78. ;  - If the caller passes in a path with a leading '\' it will be appended
  79. ;    to the current default drive & path (and the whole resulting string
  80. ;    will be returned upon exit).
  81. ;  - The current DTA is preserved.
  82. ;  - The current drive and path is preserved.
  83. ;
  84. ; These are differences between the simulator and TOS 1.4:
  85. ;
  86. ;  - There are no drive buttons in the dialog.
  87. ;  - There is still a static limit of 100 files that can be displayed.
  88. ;  - Long pathnames are NOT handled correctly.
  89. ;  - Multiple abort/continue situations will still give problems.
  90. ;  - The redraw sequence of the dialog is still the same.
  91. ;
  92. ; The things not supported are, of course, things I can't affect without
  93. ; completely re-writing the fsel_input handler.
  94. ;*************************************************************************
  95.  
  96. ;-------------------------------------------------------------------------
  97. ; Define variables which will be accessed as offsets from a3.
  98. ;  (Storage for these things will be allocated from the stack at runtime).
  99. ;-------------------------------------------------------------------------
  100.  
  101.           .abs                ; Define offsets from a3 base register...
  102.           
  103. savddrv:  ds.w      1         ; Save default drive.
  104. savdpath: ds.b      128       ; Save default path.
  105. savipath: ds.b      128       ; Save input path for compare after <CR>.
  106. savdta:   ds.l      1         ; Save pointer to current DTA.
  107. tmpdta:   ds.b      44        ; Temporary DTA for fsel_input to use.
  108. SAV_SZ    =  *                ; Size of a3-relative storage.
  109.  
  110. ;-------------------------------------------------------------------------
  111. ; Define variables which will be accessed as offsets from a5.
  112. ;  (Storage for these things is allocated in the text segment, below).
  113. ;-------------------------------------------------------------------------
  114.  
  115.           .abs                ; Define offsets from a5 base register...
  116.           
  117. prmpflag: ds.w      1         ; Flag: Has one-time object fixup been done?
  118.  
  119. treeptr:  ds.l      1         ; Ptr to tree: addrin for objc_draw() et. al.
  120. azero:    ds.w      1         ; A handy zero.
  121.  
  122. dialstuf: ds.w      1         ; Here things get a little ugly: The storage 
  123.           ds.w      2         ; from 'dialstuff' down is the intin array
  124. prmpstob: ds.w      1         ; for form_dial(FMD_FINISH).  From prmpstob
  125. prmpdpth: ds.w      1         ; down, it is also the intin array for
  126. prmpclip: ds.w      4         ; objc_draw().
  127.  
  128. lastkeyCR:ds.w      1         ; Flag: was last keystroke during fsel a <CR>?
  129.  
  130. ABS_SZ    =  *                ; Size of the a5-relative storage block.
  131.  
  132.           .text
  133.  
  134. absstore: dcb.b     ABS_SZ,0  ; Set aside memory for the a5-relative block.
  135.  
  136. ;-------------------------------------------------------------------------
  137. ; Define the TEDINFO and OBJECT structures for the prompt text. 
  138. ; (Macros for defining these things come from gemfast.sh).
  139. ;-------------------------------------------------------------------------
  140.  
  141. YSZ_PROMPT = 2
  142. YSZ_FSEL   = 9
  143. Y_OFFSET   = YSZ_PROMPT+YSZ_FSEL
  144.  
  145. prmptext: Teddef    0,0,0,3,0,TE_CNTR,$1180,0,1,31,0
  146. prmptree: Treedef   text
  147.           Objdef    ,-1,-1,-1,G_BOXTEXT,LASTOB,NORMAL,0,0,0,40,YSZ_PROMPT
  148.  
  149. ;-------------------------------------------------------------------------
  150. ; This routine is installed as a hook in the BIOS vector for the duration
  151. ; of the the fsel_input call.  It watches for a Bconin(2) call (which will
  152. ; be the AES asking for a character).  The Bconin call is done from in
  153. ; here such that we get the character back from the real BIOS and examine
  154. ; it.  If the character is a <CR>, we set the flag to say so and return
  155. ; the character to the caller.  If not a <CR> we clear the flag and 
  156. ; return the character.
  157. ;
  158. ; The whole reason for this is a bug in the pre-TOS 1.4 AES: If the user
  159. ; edited the path but didn't click the mouse on anything or change the
  160. ; filename field, then hit <CR>, the system returned a CANCEL status. This
  161. ; BIOS hook is the only way to tell for sure that the exit was via <CR>.
  162. ;-------------------------------------------------------------------------
  163.  
  164. oldbios:  dc.l      0         ; Old BIOS vector address.
  165.  
  166. bioshook:
  167.           lea       6(sp),a0            ; Assume super mode caller.
  168.           btst.b    #5,(sp)             ; Were we in super mode?
  169.           bne.s     .supermode          ; No, user mode...
  170.           move.l    usp,a0              ; So look